/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 86184
 * Date: 2023-01-28
 * Time: 9:33
 */
public class recursion {
    //6.汉诺塔

    /**
     *
     * @param n     几个盘子
     * @param pos1 起始位置
     * @param pos2 中转位置
     * @param pos3 目标位置
     */

    public static void hanio(int n,char pos1,char pos2,char pos3){
        if(n==1){
            move(pos1,pos3);
            return;
        }
        hanio(n-1,pos1,pos3,pos2);
        move(pos1,pos3);
        hanio(n-1,pos2,pos1,pos3);
    }

    /**
     *
     * @param pos1 起始位置
     * @param pos2 目标位置
     */
    public static void move(char pos1,char pos2) {
        System.out.print(pos1+"->"+pos2+" ");
    }

    //5.斐波那契数类
    public static int fib(int n) {
        if (n == 1 || n == 2) {
            return 1;
        }
        return fib(n - 1) + fib(n - 2);
    }

    /*写一个递归方法，输入一个非负整数，返回组成它的数字之和. 例如，输入 1729, 则应该返回
    1+7+2+9，它的和是19*/
    public static int add2(int x) {
        return x < 10 ? x : x % 10 + add2(x / 10);
    }

    //3. 递归求 1 + 2 + 3 + ... + 10
    public static int add(int x) {
        return x == 1 ? 1 : x + add(x - 1);
    }

    //2.按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)
    public static void print(int n) {
        if (n / 10 == 0) {
            System.out.println(n);
            return;
        }
        print(n / 10);
        System.out.println(n % 10);
    }

    // 1.递归求 N 的阶乘
    public static int factor(int n) {
        return n == 1 ? 1 : n * factor(n - 1);
    }

    public static void main(String[] args) {
        // 1.递归求 N 的阶乘
        int ret = factor(5);
        System.out.println(ret);
        //2.按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)
        print(1234);
        //3. 递归求 1 + 2 + 3 + ... + 10
        int ad1 = add(10);
        System.out.println(ad1);
        /*4.写一个递归方法，输入一个非负整数，返回组成它的数字之和. 例如，输入 1729, 则应该返回
        1+7+2+9，它的和是19*/
        int ad2 = add2(1729);
        System.out.println(ad2);
        //5.斐波那契数类
        int ad3 = fib(5);
        System.out.println(ad3);
        //6.汉诺塔
        hanio(3,'A','B','C');
    }
}
